#include "chatserver.hpp"
#include "chatservice.hpp"
#include <functional>
#include"json.hpp"
#include<string>
using namespace std;
using namespace placeholders;
using json = nlohmann::json;
ChatServer::ChatServer(EventLoop *loop,
                       const InetAddress &listenAddr,
                       const string &nameArg)
    : _server(loop, listenAddr, nameArg), _loop(loop)
{
    // 注册连接回调
    _server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));
    _server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));
    // 注册消息回调
}
// 启动服务器
void ChatServer::start()
{
    _server.start();
}

void ChatServer::onConnection(const TcpConnectionPtr & conn)
{
    // 用户断开连接
    if(!conn->connected())
    {
        // 处理客户端异常关闭
        ChatService::getInstance()->clientCloseException(conn);
        conn->shutdown();
    }
}
// 上报独写事件的回调函数
void ChatServer::onMessage(const TcpConnectionPtr & conn,
                           Buffer * buffer,
                           Timestamp time)
{
    // 收到一个消息了,将缓冲区的所有数据读取下来
    string buf = buffer->retrieveAllAsString();
    json js = json::parse(buf); // msgid 
    // 通过js[msgid] 获取业务处理器 conn js time
    // 获取单例对象
    ChatService *service = ChatService::getInstance();
    // js["msgid"]打印出来的还是一个数字 , 不能直接用，需要转换成int
    // 用方法。get<int>();
    auto msghandler = service->getMsgHandler(js["msgid"].get<int>());
    // 回调消息绑定好的事件处理器，来执行相应的回调
    msghandler(conn, js, time);
}